特征选择二:卡方检验法
The following article is from 大数据风控的一点一滴 Author 小石头
卡方检验可以用于判断两个类别变量的相关性是否显著。在分类的应用场景中可以用卡方检验选择特征,特征与目标变量的相关性越显著说明特征越重要,预测力越强。
一、先简单介绍一下卡方检验的步骤。
假设y为目标变量,取值为好和坏,x为特征变量取值为高、中、低。
1.先计算y和x的实际值列联表,如下图:
2.假设y和x不相关,总体y中坏占比=254/1831=13.87%。根据原假设,计算出假设值列联表:
3.计算卡方统计量:
其中,A是实际值,T是假设值,卡方分布的自由度=(x属性个数-1)*(y属性个数-1)=(3-1)*(2-1)=2。
上面计算的卡方值=45.41,查卡方分布表可知P(卡方值>45.41)<<0.05,所以有理由拒绝y和x不相关的原假设,即y和x有较强的相关性。
4.对于同一分布,卡方值越大,P就越小,但是不同特征的属性个数可能不一样,从而导致每个特征得到的卡方分布的自由度不同,因此在用卡方检验选择特征时,使用P值可能更准确,P值越小,特征越重要。但总体而言,P值和卡方值选择的特征差别不是很大,下面会用实例说明。
二、上面简单的介绍了卡方检验的原理,下面看如何实现卡方检验选择特征。
1.先用python展示如何进行卡方检验,用上面所举的例子。
# python3.6
import numpy as np
from scipy.stats import chi2_contingency
contingency_table = np.array([[631,364,582], [154,55,45]])
Chi2, P, degree_of_freedom, contingency_table0 = chi2_contingency(contingency_table)
其中,contingency_table是y和x实际值列联表,得到以下结果。
卡方值Chi2
Chi2
45.40836170235667
P值
P
1.37942959775444e-10
自由度degree_of_freedom
degree_of_freedom
2
假设值列联表contingency_table0
contingency_table0
array([[676.10322228, 360.87547788, 540.02129984],
[108.89677772, 58.12452212, 86.97870016]])
2.python实现卡方检验的特征选择。
(1)加载模块
import pandas as pd
from scipy.stats import chi2_contingency
(2)单变量卡方检验,y为目标变量,x为特征变量
def chi2Test(y, x):
contingency_table = pd.crosstab(y, x)
Chi2, P, degree_of_freedom, _ = chi2_contingency(contingency_table)
return Chi2, P, degree_of_freedom
(3)批量卡方检验,其中df是分箱后数据框,即连续型变量要分段处理;Kvar是主键,比如客户编号等;Yvar是目标变量。输出的chi2Test_df包含卡方值、P值、自由度。
def chi2TestBatch(df, Kvar, Yvar):
df_Xvar = df.drop([Kvar, Yvar], axis=1)
chi2list = []
Plist = []
degree_of_freedomlist = []
for col in df_Xvar.columns:
Chi2, P, degree_of_freedom = chi2Test(df[Yvar], df[col])
chi2list.append(Chi2)
Plist.append(P)
degree_of_freedomlist.append(degree_of_freedom)
names = list(df_Xvar.columns)
chi2Test_df = pd.DataFrame({'Var': names, 'Chi2': chi2list, 'P': Plist, 'degree_of_freedom': degree_of_freedomlist},
columns=['Var', 'Chi2', 'P', 'degree_of_freedom'])
return chi2Test_df
用分箱后的数据运行上述代码,看看输出结果,train_bin是分箱后的数据框,user_id是客户编号,y是目标变量。
chi2Test_df = chi2TestBatch(train_bin, 'user_id', 'y')
查看chi2Test_df,按P值从小到大排序,如下图。可以看出,一般来说卡方值越大,P值越小,但不绝对,如x_075的卡方值比x_141的大,但P值也大,这是因为x_141得到的卡方分布的自由度更小。但总体而言,根据卡方值和P值选择的特征区别很小。
最后,将卡方检验得到的变量重要性排序与IV值得到的变量重要性排序进行比较,看有什么不同。从下图可以看出,两种方法得到的排序有些差异,但差异不算太大,所以在实际应用中可以选择多种方法从不同角度对变量的重要性进行评估。
来源|大数据风控的一点一滴
作者|小石头
更多精彩,戳这里: